home *** CD-ROM | disk | FTP | other *** search
-
- /* Encode a scan line and write it to a PCX file (the line is */
- /* assumed to contain the color plane scan lines in sequence, */
- /* with padding for an even number of bytes and trailing white */
- /* data for each line as appropriate) */
-
- void pcx_write_line
- (
- unsigned char *linep, /* Scan line buffer pointer */
- int length, /* Scan line buffer length (in bytes) */
- FILE *fp /* PCX file pointer */
- )
- {
- int curr_data; /* Current data byte */
- int prev_data; /* Previous data byte */
- int data_count; /* Data repeat count */
- int line_count; /* Scan line byte count */
-
- prev_data = *linep++; /* Initialize the previous data byte */
- data_count = 1;
- line_count = 1;
-
- while (line_count < length) /* Encode scan line */
- {
- curr_data = *linep++; /* Get the current data byte */
- line_count++; /* Increment line byte count */
-
- if (curr_data == prev_data) /* Repeating data bytes ? */
- {
- data_count++; /* Increment data repeat count */
-
- if (data_count == 0x3f) /* Max allowable repeat count ? */
- {
- pcx_encode(prev_data, data_count, fp); /* Encode data */
- data_count = 0;
- }
- }
- else /* End of repeating data bytes */
- {
- if (data_count > 0)
- pcx_encode(prev_data, data_count, fp); /* Encode data */
-
- prev_data = curr_data; /* Current data byte now prev */
- data_count = 1;
- }
- }
-
- if (data_count > 0) /* Any remaining data ? */
- {
- pcx_encode(prev_data, data_count, fp); /* Encode data */
- }
- }
-
- /* Write an encoded byte pair (or single byte) to a file */
-
- void pcx_encode
- (
- int data, /* Data byte */
- int count, /* Data byte repeat count */
-
- @csource = FILE *fp /* PCX file pointer */
- )
- {
- if (((data & 0xc0) == 0xc0) || count > 1)
- {
- putc(0xc0 | count, fp); /* Write count byte */
- }
-
- putc(data, fp); /* Write data byte */
- }
-